/**
 * Supabase Access Token 管理模块
 * 提供 Token 的存储、读取、验证功能
 */

import { request } from "../api/request";

// Token 存储键名
const TOKEN_KEY = "supabase_access_token";

// Token 验证结果类型
type TokenValidationResult = {
	valid: boolean;
	message: string;
};

// 组织信息类型（用于验证 Token）
type Organization = {
	id: string;
	name: string;
};

/**
 * Token 管理类
 */
class TokenManager {
	/**
	 * 保存 Access Token
	 * @param token - Supabase Access Token
	 */
	save(token: string): void {
		uni.setStorageSync(TOKEN_KEY, token);
		// 同步设置到 request 实例
		request.setAccessToken(token);
	}

	/**
	 * 获取已保存的 Access Token
	 * @returns Token 字符串或 null
	 */
	get(): string | null {
		const token = uni.getStorageSync(TOKEN_KEY) as string;
		return token != null && token != "" ? token : null;
	}

	/**
	 * 检查是否已保存 Token
	 * @returns 是否存在 Token
	 */
	exists(): boolean {
		return this.get() != null;
	}

	/**
	 * 删除已保存的 Token
	 */
	remove(): void {
		uni.removeStorageSync(TOKEN_KEY);
		request.setAccessToken("");
	}

	/**
	 * 初始化 Token（应用启动时调用）
	 * 从本地存储读取 Token 并设置到 request 实例
	 * @returns 是否存在已保存的 Token
	 */
	init(): boolean {
		const token = this.get();
		if (token != null) {
			request.setAccessToken(token);
			return true;
		}
		return false;
	}

	/**
	 * 验证 Token 是否有效
	 * 通过调用 organizations API 来验证
	 * @param token - 要验证的 Token
	 * @returns 验证结果
	 */
	async validate(token: string): Promise<TokenValidationResult> {
		// 临时设置 Token
		const originalToken = request.getConfig().accessToken;
		request.setAccessToken(token);

		try {
			// 调用 organizations API 验证 Token
			const response = await request.get<Organization[]>("/v1/organizations");

			// 恢复原来的 Token
			request.setAccessToken(originalToken);

			if (response.success) {
				return {
					valid: true,
					message: "Token 验证成功"
				};
			}

			// 根据状态码返回不同的错误信息
			if (response.statusCode === 401) {
				return {
					valid: false,
					message: "Token 无效或已过期"
				};
			}

			if (response.statusCode === 403) {
				return {
					valid: false,
					message: "Token 权限不足"
				};
			}

			const errorMsg = response.error != null ? response.error.message : "验证失败";
			return {
				valid: false,
				message: errorMsg
			};
		} catch (error: unknown) {
			// 恢复原来的 Token
			request.setAccessToken(originalToken);

			return {
				valid: false,
				message: "网络错误，请检查网络连接"
			};
		}
	}
}

// 导出单例实例
export const tokenManager = new TokenManager();

// 默认导出
export default tokenManager;
